import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']  # Windows系统常用中文字体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 数据加载函数
def load_data():
    data = pd.read_excel("D:\\Git\\git\\practical-projects\\project\\练习一\\FhjlViewDD.xlsx")
    # 将'创建时间'列转换为datetime类型
    data['创建时间'] = pd.to_datetime(data['创建时间'])
    return data

# 任务a: 统计6月份每日矿粉货运量的日趋势，并画柱状图
def task_a(data):
    # 筛选6月份数据
    june_data = data[data['创建时间'].dt.month == 6]
    # 按日期分组统计矿粉货运量
    daily_mineral = june_data[june_data['货品'] == '矿粉'].groupby(june_data['创建时间'].dt.day)['净重'].sum()
    daily_mineral.plot(kind='bar')
    plt.title('6月份每日矿粉货运量趋势')
    plt.xlabel('日期')
    plt.ylabel('货运量(吨)')
    plt.savefig("d:\\Git\\git\\practical-projects\\project\\练习一\\矿粉趋势图.png", dpi=300, bbox_inches='tight')
    plt.show()

# 任务b: 统计6月份每日水泥货运量的日趋势图，并画柱状图
def task_b(data):
    # 筛选6月份数据
    june_data = data[data['创建时间'].dt.month == 6]
    # 按日期分组统计水泥货运量
    daily_cement = june_data[june_data['货品'] == '水泥'].groupby(june_data['创建时间'].dt.day)['净重'].sum()
    daily_cement.plot(kind='bar')
    plt.title('6月份每日水泥货运量趋势')
    plt.xlabel('日期')
    plt.ylabel('货运量(吨)')
    plt.savefig("d:\\Git\\git\\practical-projects\\project\\练习一\\水泥趋势图.png", dpi=300, bbox_inches='tight')
    plt.show()

# 任务c: 统计每个客户的6月份的货运需求量，并按大到小排序
def task_c(data):
    # 筛选6月份数据
    june_data = data[data['创建时间'].dt.month == 6]
    # 按客户分组统计总货运量
    client_demand = june_data.groupby('客户')['净重'].sum().sort_values(ascending=False)
    print('\n客户货运需求量排名:')
    print(client_demand)

# 任务d: 统计6月份各发货地的发货总量，并绘制饼图
def task_d(data):
    # 筛选6月份数据
    june_data = data[data['创建时间'].dt.month == 6]
    # 按发货地分组统计总货运量
    location_total = june_data.groupby('发货地')['净重'].sum()
    # 创建爆炸式饼图
    explode = [0.1] * len(location_total)  # 每个部分都稍微分离
    plt.pie(location_total, autopct='%1.1f%%', 
            pctdistance=0.8, 
            wedgeprops={'linewidth': 1, 'edgecolor': 'white'},
            explode=explode, startangle=90)
    plt.legend(location_total.index, title='发货地', bbox_to_anchor=(1, 0.5), loc='center left')
    plt.title('6月份各发货地发货量占比', pad=20)
    plt.ylabel('')
    plt.tight_layout()
    plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
    plt.savefig("d:\\Git\\git\\practical-projects\\project\\练习一\\发货地占比饼图.png", dpi=300, bbox_inches='tight')
    plt.show()

# 任务e: 统计6月份各车牌号的总货运量，并按大至小排序
def task_e(data):
    # 筛选6月份数据
    june_data = data[data['创建时间'].dt.month == 6]
    # 按车牌号分组统计总货运量
    plate_total = june_data.groupby('车辆')['净重'].sum().sort_values(ascending=False)
    print('\n车牌号货运量排名:')
    print(plate_total)

if __name__ == '__main__':
    data = load_data()
    task_a(data)
    task_b(data)
    task_c(data)
    task_d(data)
    task_e(data)